package com.fruit.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/** 
 * 说明：日期处理
 * 创建人：FH Q313596790
 * 修改时间：2015年11月24日
 * @version
 */
public class DateUtil {
	
	private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
	private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");
	private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd");
	private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss");
	private final static SimpleDateFormat hmsTimes = new SimpleDateFormat("HHmmss");
	
	
	public static final int	ONE_DAY_MILLISECOND	= 86400000;
	public static final long ONE_HOUR_MILLISECOND = 3600000;
	public static final int	FORMAT_DAY			= 0;	
	public static final int	FORMAT_TIME			= 1;
						

	
	public static Date getCurDate(){
		return new Date();
	}
	
	/**
	 * 获取YYYY格式
	 * @return
	 */
	public static String getSdfTimes() {
		return sdfTimes.format(new Date());
	}
	
	/**
	 * 获取YYYY格式
	 * @return
	 */
	public static String getYear() {
		return sdfYear.format(new Date());
	}

	/**
	 * 获取YYYY-MM-DD格式
	 * @return
	 */
	public static String getDay() {
		return sdfDay.format(new Date());
	}
	
	/**
	 * 获取YYYYMMDD格式
	 * @return
	 */
	public static String getDays(){
		return sdfDays.format(new Date());
	}

	/**
	 * 获取YYYY-MM-DD HH:mm:ss格式
	 * @return
	 */
	public static String getTime() {
		return sdfTime.format(new Date());
	}
	
	/**
	 * 获取HHmmss格式
	 * @return
	 */
	public static long getHsmTime() {
		return Long.parseLong(hmsTimes.format(new Date()));
	}

	/**
	* @Title: compareDate
	* @Description: TODO(日期比较，如果s>=e 返回true 否则返回false)
	* @param s
	* @param e
	* @return boolean  
	* @throws
	* @author fh
	 */
	public static boolean compareDate(String s, String e) {
		if(StringUtils.isEmpty(s) || StringUtils.isEmpty(e)){
			return false;
		}
		
		if(fomatDate(s)==null||fomatDate(e)==null){
			return false;
		}
		return fomatDate(s).getTime() >=fomatDate(e).getTime();
	}
	
	/**
	* @Title: compareDate
	* @Description: TODO(日期比较，如果s>=e 或者为空 返回true 否则返回false)
	* @param s
	* @param e
	* @return boolean  
	* @throws
	* @author fh
	 */
	public static boolean compareDate2(String s, String e) {
		if(StringUtils.isEmpty(s) || StringUtils.isEmpty(e)){
			return true;
		}
		
		if(fomatDateTime(s)==null||fomatDateTime(e)==null){
			return true;
		}
		return fomatDateTime(s).getTime() >=fomatDateTime(e).getTime();
	}

	/**
	 * 格式化日期
	 * @return
	 */
	public static Date fomatDate(String date) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 格式化日期 YYYY-MM-DD HH:mm:ss格式
	 * @return
	 */
	public static Date fomatDateTime(String date) {
		try {
			return sdfTime.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}	
	
	public static Date fomatDateTime(String date,String format) {
		DateFormat fmt = new SimpleDateFormat(format);
		try {
			return fmt.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static String fomatDateTime(String date,String format,String toFormat) {
		DateFormat fmt = new SimpleDateFormat(format);
		DateFormat tofmt = new SimpleDateFormat(toFormat);
		try {
			return tofmt.format(fmt.parse(date));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static Long fomatTimeMillis(String date,String format) {
		DateFormat fmt = new SimpleDateFormat(format);
		try {
			return fmt.parse(date).getTime();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}	
	
	public static Date fomatDateTime(String date,DateFormat fmt) {
		try {
			return fmt.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 校验日期是否合法
	 * @return
	 */
	public static boolean isValidDate(String s) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			fmt.parse(s);
			return true;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return false;
		}
	}
	
	/**
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public static int getDiffYear(String startTime,String endTime) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
		try {
			//long aa=0;
			int years=(int) (((fmt.parse(endTime).getTime()-fmt.parse(startTime).getTime())/ (1000 * 60 * 60 * 24))/365);
			return years;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
			return 0;
		}
	}
	 
	/**
     * <li>功能描述：时间相减得到天数
     * @param beginDateStr
     * @param endDateStr
     * @return
     * long 
     * @author Administrator
     */
    public static long getDaySub(String beginDateStr,String endDateStr){
        long day=0;
        java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
        java.util.Date beginDate = null;
        java.util.Date endDate = null;
        
            try {
				beginDate = format.parse(beginDateStr);
				endDate= format.parse(endDateStr);
			} catch (ParseException e) {
				e.printStackTrace();
			}
            day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
            //System.out.println("相隔的天数="+day);
      
        return day;
    }
    
    /**
     * 得到n天之后的日期
     * @param days
     * @return
     */
    public static String getAfterDayDate(int days) {
    	
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();
        
        SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfd.format(date);
        
        return dateStr;
    }
    
	public static String getAfterDayDate(String strDate, int days, int format) {

		DateFormat df = getDateFormat(format);
		Date d = getFormatedDate(df, strDate);

		Calendar c = new GregorianCalendar();
		c.setTime(d);
		c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + days);
		return df.format(c.getTime());
	}
    
    /**
     * 得到n天之后是周几
     * @param days
     * @return
     */
    public static String getAfterDayWeek(String days) {
    	int daysInt = Integer.parseInt(days);
        Calendar canlendar = Calendar.getInstance(); // java.util包
        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
        Date date = canlendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        String dateStr = sdf.format(date);
        return dateStr;
    }
    /**
     * 判断时间大小
     * @param strEndDate
     * @param strStartDate
     * @param format
     * @return
     */
	public static long subtractTime(String strEndDate, String strStartDate, String format) {

		DateFormat df = new SimpleDateFormat(format);

		Date endDate = fomatDateTime(strEndDate,df);
		Date startDate = fomatDateTime(strStartDate,df);

		long msEndDate = endDate.getTime();
		long msStartDate = startDate.getTime();

		return (msEndDate - msStartDate);
	}
	
	public static long subtractTime(Date endDate, Date startDate) {

		long msEndDate = endDate.getTime();
		long msStartDate = startDate.getTime();

		return (msEndDate - msStartDate);
	}
    

	
	private static Date getFormatedDate(DateFormat df, String strDate) {

		try {
			return df.parse(strDate);
		} catch (Exception ex) {
			throw new RuntimeException("日期格式不对，无法解析。", ex);
		}
	}
	

	private static DateFormat getDateFormat(int format) {
		if(format == 1){
			return sdfTime;
		}else{
			return sdfDay;
		}

	}
	
	 /* 
     * 将时间转换为时间戳
     */    
	public static String dateToStamp(String s) throws ParseException{
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse(s);
        long ts = date.getTime();
        res = String.valueOf(ts);
        return res;
    }
    
    /* 
     * 将时间戳转换为时间
     */
	public static String stampToDate(String s){
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }
	/**
	 * yyyy-MM-dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String dateToString(Date date){
		 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		 String dates = sdf.format(date);
		 return dates;
	}
	
	public static int daysOfTwo(Date fDate, Date oDate) {

	       Calendar aCalendar = Calendar.getInstance();

	       aCalendar.setTime(fDate);

	       int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);

	       aCalendar.setTime(oDate);

	       int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);

	       return day2 - day1;

	}
	
	public static long getMillisecondDiff(long sysdiff, long hour){
		
		return hour * ONE_HOUR_MILLISECOND - sysdiff;
		
	}
	
    public static void main(String[] args) {
    	final int prime = 31;  
        long result = 1;  
        int result2 = 1;
        long orderId = 28;
    	long startTime = Long.parseLong("148120863716200");
    	result = prime * result + (long) (orderId ^ (orderId >>> 32));  
        result = prime * result + (long) (startTime ^ (startTime >>> 32));  
        
        result2 = prime * result2 + (int) (orderId ^ (orderId >>> 32));  
        result2 = prime * result2 + (int) (startTime ^ (startTime >>> 32));  
    	System.out.println(result);
    	System.out.println(result2);
    }

}
